// 手机号码或者固话
const phoneReg = /^((0\d{2,3}-\d{7,8})|(1[34578]\d{9}))$/;
// 必须为整数
const numberReg = /^-?\d+$/;
const interReg = /^[+]{0,1}(\d+)$/;
// 密码
const passwordReg =
  /^(?![\d]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$)([^\u4e00-\u9fa5\s]){6,20}$/;
// 非特殊字符
const contactsReg = /^[\u0391-\uFFE5A-Za-z]+$/;
// 字母、数字、下划线
const dictionaryCodeReg = /^\w+$/;
// 邮箱
const emailReg =
  /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/;
// 三位数字
const threeNumberReg = /^\d{3}$/;
//两位小数
// let twoDecimalReg = /^\d+(\.\d{0,2})?$/
// 经纬度
// let latLng = /^\s*(-|\+)?(0|[1-9]\d*)\.\d{6}\s*$/
// 经度数据格式为： 整数部分为-180.0～+180.0，小数位数最多保留6位，或者输入整数部分也可以，如【-180.000000,180.000000】：

const longReg =
  /^[-+]?(0?\d{1,2}(\.\d{1,6})*|1[0-7]?\d{1}(\.\d{1,6})*|180(\.0{1,6})*)$/;

// 纬度数据格式为： 整数部分为-90.0～+90.0，小数位数最多保留6位，或者输入整数部分也可以，如【-90.000000,90.000000】：

const latReg = /^[-+]?([0-8]?\d{1}(\.\d{1,6})*|90(\.0{1,6})*)$/;

// 身份证
// let regId = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/

//15|18位身份证
const idcardReg =
  /( ^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/;

const FormValidate = (function () {
  function FormValidate() {}

  // From表单验证规则  可用于公用的校验部分
  FormValidate.Form = function () {
    return {
      // 整数验证
      validateNumber(rule, value, callback) {
        if (value !== "") {
          if (!numberReg.test(value)) {
            callback(new Error("必须为整数"));
          } else {
            callback();
          }
        } else {
          callback();
        }
      },
      // 正整数验证
      validateInter(rule, value, callback) {
        if (value !== "") {
          if (!interReg.test(value)) {
            callback(new Error("必须为正整数"));
          } else {
            callback();
          }
        } else {
          callback();
        }
      },

      // 密码验证
      validatePsdReg(rule, value, callback) {
        if (!value) {
          return callback(new Error("请输入密码"));
        }
        if (!passwordReg.test(value)) {
          callback(
            new Error(
              "请输入6-20位英文字母、数字或者符号（除空格），且字母、数字和标点符号至少包含两种"
            )
          );
        } else {
          callback();
        }
      },

      // 非数字、特殊字符验证
      validateContacts(rule, value, callback) {
        if (value) {
          if (!contactsReg.test(value)) {
            callback(new Error("不可输入数字以及特殊字符"));
          } else {
            callback();
          }
        }
      },

      // 邮箱验证
      validateEmail(rule, value, callback) {
        if (value) {
          if (!emailReg.test(value)) {
            callback(new Error("邮箱格式不正确"));
          } else {
            callback();
          }
        }
      },

      // 电话号码验证
      validatePhone(rule, value, callback) {
        if (!value) {
          return callback(new Error("请输入手机号码或者固话号码"));
        }
        if (!phoneReg.test(value)) {
          callback(new Error("请输入正确的手机号码或者固话号码"));
        } else {
          callback();
        }
      },

      // 数字、字母、下划线验证
      dictionaryCodeReg(rule, value, callback) {
        if (value) {
          if (!dictionaryCodeReg.test(value)) {
            callback(new Error("只能输入字母、数字、下划线"));
          } else {
            callback();
          }
        }
      },
      // 经度验证
      longReg(rule, value, callback) {
        if (value) {
          if (!longReg.test(value)) {
            callback(
              new Error(
                "只能输入整数部分为-180.0～+180.0，小数位数最多保留6位的数字"
              )
            );
          } else {
            callback();
          }
        }
      },
      // 纬度验证
      latReg(rule, value, callback) {
        if (value) {
          if (!latReg.test(value)) {
            callback(
              new Error(
                "只能输入整数部分为-90.0～+90.0，小数位数最多保留6位的数字"
              )
            );
          } else {
            callback();
          }
        }
      },
      // 身份证验证
      idcardReg(rule, value, callback) {
        if (value) {
          if (!idcardReg.test(value)) {
            callback(new Error("请输入合法身份证号"));
          } else {
            callback();
          }
        }
      },
      // 只能输入三位整数
      threeNumberReg(rule, value, callback) {
        if (value) {
          if (!threeNumberReg.test(value)) {
            callback(new Error("只能输入三位整数"));
          } else {
            callback();
          }
        }
      },
      // String | Array not empty
      notEmpty(rule, value, callback) {
        if (value.length) {
          callback(new Error("该字段不能为空"));
        } else {
          callback();
        }
      }
    };
  };

  return FormValidate;
})();

exports.FormValidate = FormValidate;
